﻿using Co9320.NamaAlert.Server.BackEnd;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Co9320.NamaAlert.Server.Parameters;
using System.Collections.Generic;
using System.Linq;

namespace ServerSideTest
{
    
    
    /// <summary>
    ///ModifyProcessTest のテスト クラスです。すべての
    ///ModifyProcessTest 単体テストをここに含めます
    ///</summary>
	[TestClass()]
	public class ModifyProcessTest
	{


		private TestContext testContextInstance;
		private SqlDirectControl ctrl;

		/// <summary>
		///現在のテストの実行についての情報および機能を
		///提供するテスト コンテキストを取得または設定します。
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return testContextInstance;
			}
			set
			{
				testContextInstance = value;
			}
		}

		#region 追加のテスト属性
		// 
		//テストを作成するときに、次の追加属性を使用することができます:
		//
		//クラスの最初のテストを実行する前にコードを実行するには、ClassInitialize を使用
		[ClassInitialize()]
		public static void MyClassInitialize(TestContext testContext)
		{
			using (SqlDirectControl ctrl = new SqlDirectControl())
			{
				ctrl.DeleteAllTable();
			}
		}

		//各テストを実行する前にコードを実行するには、TestInitialize を使用
		[TestInitialize()]
		public void MyTestInitialize()
		{
			ctrl = new SqlDirectControl();
		}
		//
		//各テストを実行した後にコードを実行するには、TestCleanup を使用
		//[TestCleanup()]
		//public void MyTestCleanup()
		//{
		//}
		//
		#endregion

		[TestMethod]
		public void ProcessTest()
		{
			SampleGenerator gen = new SampleGenerator();
			List<string> tags = new List<string>();

			for (int i = 0; i < ctrl.MaxTagsCount; i++)
			{
				tags.Add(gen.NextTag());
				ctrl.Add(gen.PeekStation(), gen.PeekCaster(), tags[i]);
			}

			ModifyParameter param = new ModifyParameter();
			param.Caster = gen.PeekCaster();
			param.StationId = gen.PeekStation();

			ModifyPair p = new ModifyPair();
			
			p.ModifyFrom = tags[0];
			p.ModifyTo = gen.NextTag();

			param.Tags.Add(p);

			var target = new ModifyProcess(param);
			target.DoProcess();

			var Actual = ctrl.GetTag(gen.PeekStation(), gen.PeekCaster());
			Assert.AreEqual<int>((int)ctrl.MaxTagsCount, Actual.Count());

			string elem=tags[0];
			Assert.AreEqual<int>(0, Actual.Where(tmp => tmp == elem).Count());
			for(int i=1;i<tags.Count;i++)
			{
				elem = tags[i];
				Assert.AreEqual<int>(1, Actual.Where(tmp => tmp == elem).Count());
			}
			elem = gen.PeekTag();
			Assert.AreEqual<int>(1, Actual.Where(tmp => tmp==elem).Count());
		}

		[TestMethod]
		public void AddTest()
		{
			SampleGenerator gen = new SampleGenerator();
			AddDeleteParamerter param = new AddDeleteParamerter();
			param.StationId = gen.PeekStation();
			param.Caster = gen.PeekCaster();
//			param.TagValue = new List<string>();
			param.TagValue.Add(gen.PeekTag());

			AddProcess p = new AddProcess(param);
			p.DoProcess();

		}

		[TestMethod]
		public void DeleteTest()
		{
			SampleGenerator gen = new SampleGenerator();
			ctrl.Add(gen.NextStation(), gen.PeekCaster(), gen.PeekTag());

			AddDeleteParamerter param = new AddDeleteParamerter();
			param.StationId = gen.PeekStation();
			param.Caster = gen.PeekCaster();
			param.TagValue.Add(gen.PeekTag());

			DeleteProcess p = new DeleteProcess(param);
			p.DoProcess();

			var Actual = ctrl.GetTag(param.StationId, param.Caster);
			Assert.AreEqual<int>(0, Actual.Count());
		}

	}
}
